package cn.iocoder.yudao.module.eval.service.workflow;

import cn.iocoder.yudao.module.eval.dal.dataobject.plan.EvalPlanDO;

/**
 * 评价工作流 Service 接口
 *
 * @author 芋道源码
 */
public interface EvalWorkflowService {

    /**
     * 检查计划状态流转是否合法
     *
     * @param currentStatus 当前状态
     * @param targetStatus 目标状态
     * @return 是否合法
     */
    boolean isValidStatusTransition(Integer currentStatus, Integer targetStatus);

    /**
     * 执行计划状态流转
     *
     * @param planId 计划ID
     * @param targetStatus 目标状态
     * @param operatorId 操作人ID
     * @param comments 备注
     */
    void executeStatusTransition(Long planId, Integer targetStatus, Long operatorId, String comments);

    /**
     * 获取计划可执行的下一步操作
     *
     * @param planId 计划ID
     * @return 可执行操作列表
     */
    Object getAvailableActions(Long planId);

    /**
     * 检查计划是否满足发布条件
     *
     * @param planId 计划ID
     * @return 检查结果
     */
    Object checkPublishConditions(Long planId);

    /**
     * 检查计划是否满足开始评价条件
     *
     * @param planId 计划ID
     * @return 检查结果
     */
    Object checkStartConditions(Long planId);

    /**
     * 检查计划是否满足完成条件
     *
     * @param planId 计划ID
     * @return 检查结果
     */
    Object checkCompleteConditions(Long planId);

    /**
     * 自动推进计划状态
     *
     * @param planId 计划ID
     */
    void autoAdvancePlanStatus(Long planId);

    /**
     * 批量处理计划状态
     *
     * @param planIds 计划ID列表
     * @param targetStatus 目标状态
     * @param operatorId 操作人ID
     */
    void batchProcessPlanStatus(java.util.List<Long> planIds, Integer targetStatus, Long operatorId);

    /**
     * 发送状态变更通知
     *
     * @param plan 计划信息
     * @param oldStatus 原状态
     * @param newStatus 新状态
     * @param operatorId 操作人ID
     */
    void sendStatusChangeNotification(EvalPlanDO plan, Integer oldStatus, Integer newStatus, Long operatorId);

}
